スキャフォールディング(足場組み)
===========

作成(Create)、読み出し(Read)、更新(Update)、削除(Delete) といういわゆる CRUD は、アプリケーションでのデータオブジェクトに対する4つの基本操作です。
ウェブアプリケーション開発において CRUD 操作を実装するタスクが必要になるのは、きわめて普通のことです。
そのため、この CRUD 操作を実装するプロセス (**スキャフォールディング(足場組み)** とも呼ばれます) を自動化するために、Yii は **Gii** という名前のもとに、いくつかのコード生成ツールを提供しています。

> Note|注意: Gii は、バージョン 1.1.2 から利用可能です。それまでは、この目的には [yiicシェルツール](http://www.yiiframework.com/doc/guide/ja/quickstart.first-app-yiic) を使用する必要がありました。

以降では、ブログアプリケーションの記事とコメントの CRUD 操作をこのツールによって実装する方法を紹介します。


Gii のインストール
--------------

最初に Gii をインストールする必要があります。ファイル `/wwwroot/blog/protected/config/main.php` を開き、以下のコードを追加してください。

~~~
[php]
return array(
	......
	'import'=>array(
		'application.models.*',
		'application.components.*',
	),

	'modules'=>array(
		'gii'=>array(
			'class'=>'system.gii.GiiModule',
			'password'=>'pick up a password here',
		),
	),
);
~~~

上記のコードが `gii` という名のモジュールをインストールします。これによって、以下の URL をブラウザに入力して Gii モジュールにアクセスすることが出来るようになります。

~~~
http://www.example.com/blog/index.php?r=gii
~~~

パスワードを入力するように指示されますので、`/wwwroot/blog/protected/config/main.php` であらかじめ設定しておいたパスワードを入力して下さい。すると、利用可能な全てのコード生成ツールがリストされたページが表示されます。

> Note|注意: Yii を実運用マシンで走らせる場合は、上記コードは削除すべきです。コード生成ツールは開発マシンでのみ使用すべきです。


モデルの作成
---------------

最初に、それぞれのデータベーステーブルに対して [モデル](http://www.yiiframework.com/doc/guide/ja/basics.model) クラスを作成する必要があります。このチュートリアルを読み進むと分るように、モデルクラスによって直観的なオブジェクト指向のやり方でデータベースにアクセスすることが出来るようになります。

`Model Generator` リンクをクリックして、モデル生成ツールの使用を開始してください。

`Model Generator` ページで、`Table Name` フィールドに `tbl_user` (ユーザテーブル名)、`Table Prefix` フィールドに `tbl_` と入力し、`Preview` ボタンを押します。
すると、プレビューテーブルが表示されます。テーブル内のリンクをクリックすることで、生成されるコードをプレビューすることができます。
もし、全てが OK であれば、`Generate` ボタンを押すことによりコードを生成してファイルに保存することができます。

> Info|情報: コードジェネレータは生成されたコードをファイルに保存する必要があるため、ウェブプロセスが対応するファイルを生成・更新するパーミッションが必要になります。
手っ取り早い方法として、`/wwwroot/blog` ディレクトリ全体をウェブプロセスから書込み可能にしても構いません。ただし、これは開発マシンで `Gii` を使用するときのみ必要であることに注意してください。

残りのデータベーステーブル (`tbl_post`, `tbl_comment`, `tbl_tag`, `tbl_lookup`) について、同じ手順を繰り返します。

> Tip|ヒント: `Table Name`フィールドにアスタリスク `*` を入力することも可能です。これにより一発で、**全ての** データベーステーブルのモデルクラスが生成されます。

この段階において、以下のファイルが新しく生成されています。

 * `models/User.php` は [CActiveRecord] を継承する `User` クラスを含みます。このクラスは `tbl_user` データベーステーブルにアクセスするのに使われます。
 * `models/Post.php` は [CActiveRecord] を継承する `Post` クラスを含みます。このクラスは `tbl_post` データベーステーブルにアクセスするのに使われます。
 * `models/Tag.php` は [CActiveRecord] を継承する `Tag` クラスを含みます。このクラスは `tbl_tag` データベーステーブルにアクセスするのに使われます。
 * `models/Comment.php` は [CActiveRecord] を継承する `Comment` クラスを含みます。このクラスは `tbl_comment` データベーステーブルにアクセスするのに使われます。
 * `models/Lookup.php` は [CActiveRecord] を継承する `Lookup` クラスを含みます。このクラスは `tbl_lookup` データベーステーブルにアクセスするのに使われます。


CRUD 操作の実装
----------------------------

モデルクラスが生成された後は、これらのモデルについて CRUD 操作を実装するコードを生成する `Crud Generator` が使用可能です。
`Post` と `Comment` のモデルについてこれを行います。

`Crud Generator` のページにおいて、`Model Class` フィールドに `Post`(たった今作成した記事のモデルクラス名)を入力し、`Preview` ボタンを押します。すると、たくさんのファイルが生成されることになるのが分ります。`Generate` ボタンを押して、それらを生成して下さい。


`Comment` モデルについても同じ手順を繰り返します。

CRUD ジェネレータによって生成されたファイルを見てみましょう。全てのファイルは `/wwwroot/blog/protected` 以下に生成されます。
便宜上、それらのファイルを [コントローラ](http://www.yiiframework.com/doc/guide/ja/basics.controller) ファイルと [ビュー](http://www.yiiframework.com/doc/guide/ja/basics.view) ファイルに分類します。

 - コントローラファイル:
	 * `controllers/PostController.php` は `PostController`クラスを含みます。このコントローラは記事の CRUD 操作を受け持ちます。
	 * `controllers/CommentController.php` は `CommentController` クラスを含みます。このコントローラはコメントの CRUD 操作を受け持ちます。

 - ビューファイル:
	 * `views/post/create.php` は新しい記事を作る HTML フォームを表示するビューファイルです。
	 * `views/post/update.php` は記事の更新を行う HTML フォームを表示するビューファイルです。
	 * `views/post/view.php` は記事の詳細情報を表示するビューファイルです。
	 * `views/post/index.php` は記事のリストを表示するビューファイルです。
	 * `views/post/admin.php` は管理コマンドと一緒に表形式で記事を表示するビューファイルです。
	 * `views/post/_form.php` は部分ビューファイルであり `views/post/create.php` と `views/post/update.php` に埋め込まれます。これは記事情報を入力する HTML フォームを表示します。
	 * `views/post/_view.php` は部分ビューファイルであり `views/post/index.php` で使用されます。これは単一の記事の簡単なビューを表示します。
	 * `views/post/_search.php` は部分ビューファイルであり `views/post/admin.php` で使用されます。検索フォームを表示します。
	 * 同様のビューファイル一式がコメント用にも生成されます。

試験
-------

以下のURLにアクセスすることにより、たった今生成したコードを試験することができます。

~~~
http://www.example.com/blog/index.php?r=post
http://www.example.com/blog/index.php?r=comment
~~~

自動生成されたコードによる記事とコメントの機能は、お互いに完全に独立していることに注意してください。また、新しい記事やコメントを作成する際に、`author_id` や `create_time` といった情報を入力するように要求されます。これらの情報は実際のアプリケーションではプログラムによって設定されるべきものです。しかし心配することはありません。次のマイルストーンでこれらの問題を解決します。今のところは、このプロトタイプがブログアプリケーションに必要なほぼすべての機能をそなえていることに、それなりに満足すべきでしょう。

上記ファイルがどう使われるかをよりよく理解するために、ブログアプリケーションで記事の一覧が表示される場合のワークフローを示します。

 0. ユーザが URL `http://www.example.com/blog/index.php?r=post` をリクエストします。
 1. ウェブサーバにより [エントリスクリプト](http://www.yiiframework.com/doc/guide/ja/basics.entry) が実行され、リクエストを処理するために、[アプリケーション](http://www.yiiframework.com/doc/guide/ja/basics.application) インスタンスが作成され初期化されます。
 2. アプリケーションは `PostController` のインスタンスを作成し、実行します。
 3. `PostController` インスタンスは要求された `index` アクションを、`actionIndex()` メソッドを呼ぶことで実行します。ユーザがアクションを明示的に URL 中で示さなかった場合、`index` がデフォルトのアクションとなることに注意して下さい。
 4. `actionIndex()` メソッドはデータベースに問い合わせを行い、最近の記事リストを取り出します。
 5. `actionIndex()` メソッドは、記事データを `index` ビューで描画します。

<div class="revision">$Id$</div>
